Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / feature / connections / src / androidMain / kotlin / org / meshtastic / feature / connections / domain / usecase / AndroidGetDiscoveredDevicesUseCase.kt

Displaying Raw • Download

feature/connections/src/androidMain/kotlin/org/meshtastic/feature/connections/domain/usecase/AndroidGetDiscoveredDevicesUseCase.kt bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 7.55 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.connections.domain.usecase

Tff7b72import T7ee787android.hardware.usb.UsbManager
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787org.jetbrains.compose.resources.getString
Tff7b72import T7ee787org.koin.core.annotation.Single
Tff7b72import T7ee787org.meshtastic.core.ble.BluetoothRepository
Tff7b72import T7ee787org.meshtastic.core.common.database.DatabaseManager
Tff7b72import T7ee787org.meshtastic.core.datastore.RecentAddressesDataSource
Tff7b72import T7ee787org.meshtastic.core.datastore.model.RecentAddress
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.network.repository.DiscoveredService
Tff7b72import T7ee787org.meshtastic.core.network.repository.UsbRepository
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.core.repository.RadioInterfaceService
Tff7b72import T7ee787org.meshtastic.core.resources.Res
Tff7b72import T7ee787org.meshtastic.core.resources.meshtastic
Tff7b72import T7ee787org.meshtastic.feature.connections.model.AndroidUsbDeviceData
Tff7b72import T7ee787org.meshtastic.feature.connections.model.DeviceListEntry
Tff7b72import T7ee787org.meshtastic.feature.connections.model.DiscoveredDevices
Tff7b72import T7ee787org.meshtastic.feature.connections.model.GetDiscoveredDevicesUseCase
Tff7b72import T7ee787org.meshtastic.feature.connections.model.getMeshtasticShortName
Tff7b72import T7ee787java.util.Locale

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongParameterListTa5d6ff"Tb4b4b4)
Tf0883e@SingleTb4b4b4(Te6edf3binds Tff7b72= Tff7b72[Te6edf3GetDiscoveredDevicesUseCaseTff7b72::Te6edf3classTff7b72]Tb4b4b4)
Tff7b72class T56d364AndroidGetDiscoveredDevicesUseCaseTb4b4b4(
Tff7b72private Tff7b72val Te6edf3bluetoothRepositoryTb4b4b4: Te6edf3BluetoothRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3recentAddressesDataSourceTb4b4b4: Te6edf3RecentAddressesDataSourceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeRepositoryTb4b4b4: Te6edf3NodeRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3databaseManagerTb4b4b4: Te6edf3DatabaseManagerTb4b4b4,
Tff7b72private Tff7b72val Te6edf3usbRepositoryTb4b4b4: Te6edf3UsbRepositoryTb4b4b4,
Tff7b72private Tff7b72val Te6edf3radioInterfaceServiceTb4b4b4: Te6edf3RadioInterfaceServiceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3usbManagerLazyTb4b4b4: Te6edf3LazyTff7b72<Te6edf3UsbManagerTff7b72>Tb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3GetDiscoveredDevicesUseCase Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3macSuffixLength Tff7b72= T79c0ff8

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4)
Tff7b72override Tff7b72fun Td2a8ffinvokeTb4b4b4(
Te6edf3showMockTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3showReplayTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3resolvedListTb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3DiscoveredServiceTff7b72>Tff7b72>Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3DiscoveredDevicesTff7b72> Tb4b4b4{
Tff7b72val Te6edf3nodeDb Tff7b72= Te6edf3nodeRepositoryTb4b4b4.Te6edf3nodeDBbyNum

T8b949e// Filter out non-Meshtastic peripherals (headphones, cars, watches, etc.).
T8b949e// BluetoothAdapter.bondedDevices returns every bonded device on the phone, so we
T8b949e// must restrict the picker to entries whose advertised name matches the
T8b949e// Meshtastic firmware pattern (see MeshtasticBleConstants.BLE_NAME_PATTERN).
Tff7b72val Te6edf3bondedBleFlow Tff7b72=
Te6edf3bluetoothRepositoryTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3ble Tff7b72-Tff7b72>
Te6edf3bleTb4b4b4.Te6edf3bondedDevicesTb4b4b4.Te6edf3filter Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3getMeshtasticShortNameTb4b4b4(Tb4b4b4) Tff7b72!Tff7b72= Tff7b72null Tb4b4b4}Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tff7b72val Te6edf3processedTcpFlow Tff7b72=
Te6edf3combineTb4b4b4(Te6edf3resolvedListTb4b4b4, Te6edf3recentAddressesDataSourceTb4b4b4.Te6edf3recentAddressesTb4b4b4) Tb4b4b4{ Te6edf3tcpServicesTb4b4b4, Te6edf3recentList Tff7b72-Tff7b72>
Tff7b72val Te6edf3defaultName Tff7b72= Te6edf3getStringTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3meshtasticTb4b4b4)
Te6edf3processTcpServicesTb4b4b4(Te6edf3tcpServicesTb4b4b4, Te6edf3recentListTb4b4b4, Te6edf3defaultNameTb4b4b4)
Tb4b4b4}

Tff7b72val Te6edf3usbDevicesFlow Tff7b72=
Te6edf3usbRepositoryTb4b4b4.Te6edf3serialDevicesTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3usb Tff7b72-Tff7b72>
Te6edf3usbTb4b4b4.Te6edf3map Tb4b4b4{ Tb4b4b4(Te6edf3stableKeyTb4b4b4, Te6edf3dTb4b4b4) Tff7b72-Tff7b72>
Te6edf3DeviceListEntryTb4b4b4.Te6edf3UsbTb4b4b4(
Te6edf3usbData Tff7b72= Te6edf3AndroidUsbDeviceDataTb4b4b4(Te6edf3dTb4b4b4)Tb4b4b4,
Te6edf3name Tff7b72= Te6edf3dTb4b4b4.Te6edf3deviceTb4b4b4.Te6edf3deviceNameTb4b4b4,
T8b949e// Address must be the stable map key, not the device path: the path (deviceName) is reassigned
T8b949e// on every re-enumeration, so a path-based saved address can't survive a reboot/replug.
Te6edf3fullAddress Tff7b72=
Te6edf3radioInterfaceServiceTb4b4b4.Te6edf3toInterfaceAddressTb4b4b4(
Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3InterfaceIdTb4b4b4.Te6edf3SERIALTb4b4b4,
Te6edf3stableKeyTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3bonded Tff7b72= Te6edf3usbManagerLazyTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3hasPermissionTb4b4b4(Te6edf3dTb4b4b4.Te6edf3deviceTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72return Te6edf3combineTb4b4b4(
Te6edf3nodeDbTb4b4b4,
Te6edf3bondedBleFlowTb4b4b4,
Te6edf3processedTcpFlowTb4b4b4,
Te6edf3usbDevicesFlowTb4b4b4,
Te6edf3resolvedListTb4b4b4,
Te6edf3recentAddressesDataSourceTb4b4b4.Te6edf3recentAddressesTb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3argsTb4b4b4: Te6edf3ArrayTff7b72<Tffa657AnyTff7b72> Tff7b72-Tff7b72>
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3db Tff7b72= Te6edf3argsTff7b72[T79c0ff0Tff7b72] Tff7b72as Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72>

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3bondedBle Tff7b72= Te6edf3argsTff7b72[T79c0ff1Tff7b72] Tff7b72as Te6edf3ListTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTff7b72>

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3processedTcp Tff7b72= Te6edf3argsTff7b72[T79c0ff2Tff7b72] Tff7b72as Te6edf3ListTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3TcpTff7b72>

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3usbDevices Tff7b72= Te6edf3argsTff7b72[T79c0ff3Tff7b72] Tff7b72as Te6edf3ListTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3UsbTff7b72>

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3resolved Tff7b72= Te6edf3argsTff7b72[T79c0ff4Tff7b72] Tff7b72as Te6edf3ListTff7b72<Te6edf3DiscoveredServiceTff7b72>

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffUNCHECKED_CASTTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3recentList Tff7b72= Te6edf3argsTff7b72[T79c0ff5Tff7b72] Tff7b72as Te6edf3ListTff7b72<Te6edf3RecentAddressTff7b72>

Tff7b72val Te6edf3bleForUi Tff7b72= Te6edf3matchBleNodesTb4b4b4(Te6edf3bondedBleTb4b4b4, Te6edf3dbTb4b4b4)
Tff7b72val Te6edf3usbForUi Tff7b72= Te6edf3matchUsbNodesTb4b4b4(Te6edf3usbDevicesTb4b4b4, Te6edf3showMockTb4b4b4, Te6edf3showReplayTb4b4b4, Te6edf3dbTb4b4b4)

Tff7b72val Te6edf3discoveredTcpForUi Tff7b72= Te6edf3matchDiscoveredTcpNodesTb4b4b4(Te6edf3processedTcpTb4b4b4, Te6edf3dbTb4b4b4, Te6edf3resolvedTb4b4b4, Te6edf3databaseManagerTb4b4b4)
Tff7b72val Te6edf3discoveredTcpAddresses Tff7b72= Te6edf3processedTcpTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3fullAddress Tb4b4b4}Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3recentTcpForUi Tff7b72= Te6edf3buildRecentTcpEntriesTb4b4b4(Te6edf3recentListTb4b4b4, Te6edf3discoveredTcpAddressesTb4b4b4, Te6edf3dbTb4b4b4, Te6edf3databaseManagerTb4b4b4)

Te6edf3DiscoveredDevicesTb4b4b4(
Te6edf3bleDevices Tff7b72= Te6edf3bleForUiTb4b4b4,
Te6edf3usbDevices Tff7b72= Te6edf3usbForUiTb4b4b4,
Te6edf3discoveredTcpDevices Tff7b72= Te6edf3discoveredTcpForUiTb4b4b4,
Te6edf3recentTcpDevices Tff7b72= Te6edf3recentTcpForUiTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffmatchBleNodesTb4b4b4(Te6edf3bondedBleTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTff7b72>Tb4b4b4, Te6edf3dbTb4b4b4: Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3BleTff7b72> Tff7b72=
Te6edf3bondedBle
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3entry Tff7b72-Tff7b72>
Tff7b72val Te6edf3matchingNode Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3databaseManagerTb4b4b4.Te6edf3hasDatabaseForTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3fullAddressTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3dbTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3find Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Tff7b72val Te6edf3macSuffix Tff7b72=
Te6edf3entryTb4b4b4.Te6edf3deviceTb4b4b4.Te6edf3addressTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3takeLastTb4b4b4(Te6edf3macSuffixLengthTb4b4b4)Tb4b4b4.Te6edf3lowercaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)
Tff7b72val Te6edf3nameSuffix Tff7b72= Te6edf3entryTb4b4b4.Te6edf3deviceTb4b4b4.Te6edf3getMeshtasticShortNameTb4b4b4(Tb4b4b4)Tff7b72?.Te6edf3lowercaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)
Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3idTb4b4b4.Te6edf3lowercaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)Tb4b4b4.Te6edf3endsWithTb4b4b4(Te6edf3macSuffixTb4b4b4) Tff7b72|Tff7b72|
Tb4b4b4(Te6edf3nameSuffix Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3nodeTb4b4b4.Te6edf3userTb4b4b4.Te6edf3idTb4b4b4.Te6edf3lowercaseTb4b4b4(Te6edf3LocaleTb4b4b4.Te6edf3ROOTTb4b4b4)Tb4b4b4.Te6edf3endsWithTb4b4b4(Te6edf3nameSuffixTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72null
Tb4b4b4}
Te6edf3entryTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3node Tff7b72= Te6edf3matchingNodeTb4b4b4)
Tb4b4b4}
Tb4b4b4.Te6edf3sortedBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3name Tb4b4b4}

Tff7b72private Tff7b72suspend Tff7b72fun Td2a8ffmatchUsbNodesTb4b4b4(
Te6edf3usbDevicesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTb4b4b4.Te6edf3UsbTff7b72>Tb4b4b4,
Te6edf3showMockTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3showReplayTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3dbTb4b4b4: Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72>Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DeviceListEntryTff7b72> Tff7b72= Tb4b4b4(Te6edf3usbDevices Tff7b72+ Te6edf3virtualDeviceEntriesTb4b4b4(Te6edf3showMockTb4b4b4, Te6edf3showReplayTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3entry Tff7b72-Tff7b72>
Te6edf3entryTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3node Tff7b72= Te6edf3findNodeByNameSuffixTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3nameTb4b4b4, Te6edf3entryTb4b4b4.Te6edf3fullAddressTb4b4b4, Te6edf3dbTb4b4b4, Te6edf3databaseManagerTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.1s